03. 与源项目保持同步

当你在对仓库进行更改的特性分支上工作时,该仓库可能会从原作者处接收更新。

Star(收藏)和 Watch(关注)

如果你想跟进仓库的动态,GitHub 提供了一个非常方便的方式 - 它能让你 star 仓库:

_Star 按钮和仓库的级别_

Star 按钮和仓库的级别

你可以前往 https://github.com/stars 列出和过滤你 star 过的所有仓库。

如果你想跟踪特定仓库,star 非常有用。但是,如果你想实时跟进仓库的发展就不行了,你得手动前往收藏页面查看仓库,以检查它们是否发生变化。

💡 Star 和受欢迎度 💡

Star 是能帮助你跟踪感兴趣仓库的一个有用功能,同时也成为了衡量仓库受欢迎程度的手段。

如果你对提升仓库的星级不感兴趣,不如了解一下 "watch" 仓库。现在就在看看吧!

Watch 仓库

如果你要跟进一个项目的变化,并希望接收变更通知,GitHub 为你提供了 "Watch" 功能:

_通知设置页。"Watching" 一个仓库会通知你仓库的所有活动。_

通知设置页。"Watching" 一个仓库会通知你仓库的所有活动。

如果你频繁地在一个仓库上工作,那么我建议你将 watch 设置改为"Watching"(持续关注)。这样,当该仓库发生任何活动时,GitHub 都会通知你,例如当有人向仓库推送变更,创建了新的 Issues,或者在现有 Issues 中添加了评论。

加入上传更改

现在你了解了 watch 仓库的好处,假设你在 watch 一个仓库,这时收到一个通知说有一些 commit 被推送到了初始源仓库。你如何让这些更改进入你 fork 的仓库副本中?如果你想继续在你的 fork 上进行开发,那么就需要让你 fork 的副本尽可能与源仓库保持同步。

来看看如何让这些变更从远程仓库进入我们自己的仓库。 instructor_notes: ''

L3 - 包含上游更改

假使 Lam 开始对她的项目进行更改了,我的 fork 中不会获得这些更改,我要将她的项目添加为额外远程仓库,以便与她保持同步。

在我的本地仓库中,我已经有一个远程仓库了,那就是 origin

_终端显示了与远程仓库的现有连接。这是我的简写名为 `origin` 的远程仓库。_

终端显示了与远程仓库的现有连接。这是我的简写名为 origin 的远程仓库。

注意 origin 一词只是第一次 git clone 远程仓库时使用的 默认 名称。我们将使用 git remote 命令来向此列表 添加一个新的 简写名和 URL。这会提供给我们一个与源仓库之间的连接。

$ git remote add upstream https://github.com/udacity/course-collaboration-travel-plans.git

注意我使用名称 upstream 作为引用源仓库的简写名。与 origin 简写名一样,这里的 upstream 一词也并不特别;这只是一个常规的词。它可以是任何词… 比如 "banana"。但 "upstream" 一词通常用于引用源仓库。

我们来看看在添加了新的远程仓库后,远程仓库的列表现在是什么样的:

_终端显示了关于这两个远程仓库的信息 - `origin` 和 `upstream`。_

终端显示了关于这两个远程仓库的信息 - origin upstream

Origin 与 Upstream 差别

现在令人困惑的一点可能是 origin upstream 之间的差别。其中, origin 指的 不是 我们 fork 自的源仓库(也称为 "初始" 仓库),而是指我们 fork 后的仓库。虽然它叫 origin ,但实际并不是初始仓库。

记住, origin upstream 只是默认或实际名称。如果你觉得将 origin 远程仓库命名为 mine upstream 远程仓库命名为 source-repo 对你来说更清楚,那么你尽可如此命名。你在本地仓库如何命名远程仓库完全不影响源仓库。

_使用 `git remote rename` 命令将 `origin` 重命名为 `mine`,以及将 `upstream` 重命名为 `source-repo`。_

使用 git remote rename 命令将 origin 重命名为 mine ,以及将 upstream 重命名为 source-repo

⚠️ 重置远程仓库名称 ⚠️

上面的图显示了远程仓库的重命名,但我已经使用以下命令将它们变回了默认/实际名称 origin upstream

$ git remote rename mine origin
$ git remote rename source-repo upstream

拉取上游变更

现在,要获得上游远程仓库的更改,我们只需运行 git pull 并使用 upstream 简写名,而不是 origin 简写名:

$ git pull upstream master

_终端显示了运行 `git fetch upstream master` 的结果。一个新的分支添加到了本地仓库。_

终端显示了运行 git fetch upstream master 的结果。一个新的分支添加到了本地仓库。

现在你已向新的 upstream 远程仓库添加了一个连接,如果你运行 git fetch upstream master ,它会更新你在 GitHub 上 fork 的仓库 吗?

SOLUTION:

现在,我们已从上游远程仓库获取了所有更改,接下来查看日志,看看我们的本地仓库中有哪些新信息。我使用 git log 命令来确保显示所有分支的 所有 commit(包括远程和跟踪分支!):

$ git log --oneline --graph --decorate --all

_终端在获取 `upstream` 远程仓库的变更后,显示了我的本地仓库的日志。_

终端在获取 upstream 远程仓库的变更后,显示了我的本地仓库的日志。

在提交说明的包裹下阅读可能有点困难,但你应该能看到,现在本地 master 分支前有一个 upstream/master 远程分支。 upstream/master 位于 commit 52e493f 上,而 master 分支位于 commit 1c12194 上。

我们可以使用 upstream/master 分支来跟踪源仓库 master 分支的位置。现在,我们可以运行 git fetch upstream master ,获取对源仓库的 master 分支所做的更改。

QUESTION:

使用 git fetch upstream master 命令拉取了 upstream 远程仓库的 master 分支上的更改。

如果我们想获取 upstream/master 更改 将它们合并到 master 分支,我们应使用什么命令?

SOLUTION:

NOTE: The solutions are expressed in RegEx pattern. Udacity uses these patterns to check the given answer

要向 Lam 的仓库推送这些新更改,我们不想运行 git push origin upstream/master ,因为 upstream/master 不是本地分支。要将这些更改融入我 fork 的她的项目版本,我可以将 upstream/master 合并到一个现有分支中(例如本地 master 分支)然后推送它。

# 确保我位于正确的合并分支上
$ git checkout master

# 合并 Lam 的更改
$ git merge upstream/master

# 将 Lam 的更改发送到*我的*远程仓库
$ git push origin master

小结

当在你 fork 的项目副本上工作时,初始项目的维护者会继续向他们的项目添加更改。你需要将你的 fork 副本与他们的项目保持同步,以包含他们所做的任何更改。

要将源仓库的更改提取到你在 GitHub 上 fork 的仓库副本,你需要:

  • 获得源仓库的可克隆 URL
  • 使用 git remote add 命令创建一个新的远程仓库
    • 使用简写名 upstream 指向源仓库
    • 提供源仓库的 URL
  • 获取新的 upstream 远程仓库
  • upstream 的分支合并到本地分支
  • 将新更新的本地分支推送到你的 origin 仓库